/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package clasificador.genetico;

import java.util.ArrayList;
import java.util.List;
import utils.Copyable;

import utils.Weighted;

/**
 *
 * @author e237573
 */
public class PoliticaMezclaElitista<Genotipo extends Copyable<Genotipo>> 
        extends PoliticaMezcla<Genotipo> {

    private double prop;

    public PoliticaMezclaElitista(
            PoliticaEmparejamiento<Genotipo> emparejamiento, 
            PoliticaCruce<Genotipo> cruce, 
            double prop) {
        super(emparejamiento, cruce);
        this.prop = prop;
    }

    @Override
    public ArrayList<Genotipo> mezclar(ArrayList<Weighted<Genotipo>> poblacion) {
        // Seleccionar elite
        int nIndividuos = (int) Math.max(1, poblacion.size() * prop);
        List<Weighted<Genotipo>> elite = poblacion.subList(0, nIndividuos);

        ArrayList<Genotipo> buffer = super.mezclar(poblacion);

        // Preservar elite
        for (Weighted<Genotipo> gen : elite) {
            buffer.add(gen.l().copy());
        }

        return buffer;
    }
}
